package pe.gob.mininter.dirandro.vaadin.panel.mantenimiento;

import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.CentroPoblado;
import pe.gob.mininter.dirandro.model.Distrito;
import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.CentroPobladoService;
import pe.gob.mininter.dirandro.service.UbigeoService;
import pe.gob.mininter.dirandro.service.ValorService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.ui.AbstractSelect.Filtering;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.TreeTable;
import com.vaadin.ui.VerticalLayout;

public class PanelMantenPoblado extends DirandroComponent implements TextChangeListener, ClickListener{

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout pnlPrincipal;
	@AutoGenerated
	private VerticalLayout pnlDatosEstado;
	@AutoGenerated
	private HorizontalLayout pnlEstadoBotones;
	@AutoGenerated
	private Button btnEliminar;
	@AutoGenerated
	private Button btnCrearEstado;
	@AutoGenerated
	private ComboBox cmbEstado;
	@AutoGenerated
	private ComboBox cmbDistrito;
	@AutoGenerated
	private ComboBox cmbCategoria;
	@AutoGenerated
	private TextField txtNombre;
	@AutoGenerated
	private VerticalLayout pnlListadoEstado;
	@AutoGenerated
	private TreeTable tblCentroPoblado;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;
	@AutoGenerated
	private TextField txtFiltroDistrito;
	@AutoGenerated
	private TextField txtFiltroNombre;
	@AutoGenerated
	private TextField txtFiltroCategoria;
	@AutoGenerated
	private Label lblFiltroBusqueda;
	private static final long serialVersionUID = 8017458567665421578L;
	
	private CentroPobladoService centroPobladoService;
	//private EstadoService estadoService;
	private ValorService valorService;
	private boolean flagNuevaEstado;
	private List<Valor> lstEstados;
	private List<Valor> lstCategoria;
	private List<Distrito> lstDistritos;
	private UbigeoService ubigeoService;
	private CentroPoblado centroPoblado;
	
	public PanelMantenPoblado(List<Opcion> acciones, String height){
		super(acciones, height);
		centroPobladoService = Injector.obtenerServicio(CentroPobladoService.class);
		//estadoService = Injector.obtenerServicio(EstadoService.class);
		valorService = Injector.obtenerServicio(ValorService.class);
		ubigeoService = Injector.obtenerServicio(UbigeoService.class);
		buildMainLayout();
		setCompositionRoot(mainLayout);
		postConstruct();
	}
	
	@Override
	public void postConstruct() {
		mainLayout.setStyleName("backColor");
		btnCrearEstado.setIcon(Constante.ICONOS.SAVE);
		btnEliminar.setIcon(Constante.ICONOS.DELETE);
		
		habilitarEdicion(false);
		
		lstCategoria = valorService.obtenerLista(Constante.LISTA.CODIGO.CENTRO_POBLADO_CATEGORIA);
		lstEstados = valorService.obtenerLista(Constante.LISTA.CODIGO.ESTADO);
		
		BeanItemContainer<Valor> bicEstados = new BeanItemContainer<Valor>(Valor.class,  lstEstados);
		cmbEstado.setContainerDataSource(bicEstados);
		cmbEstado.setItemCaptionPropertyId("nombre");
		cmbEstado.setInputPrompt("Estado");
		
		cmbCategoria.setContainerDataSource(new BeanItemContainer<Valor>(Valor.class,  lstCategoria));
		cmbCategoria.setItemCaptionPropertyId("nombre");
		cmbCategoria.setInputPrompt("Estado");
		
		lstDistritos = ubigeoService.obtenerTodos();
		cmbDistrito.setContainerDataSource( new BeanItemContainer<Distrito>(Distrito.class, lstDistritos));
		cmbDistrito.setItemCaptionPropertyId("nombreCompleto");
		cmbDistrito.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		cmbDistrito.setInputPrompt("Distrito");
		
		
		txtFiltroCategoria.setImmediate(true);
		txtFiltroNombre.setImmediate(true);
		//txtFiltroCodigo.setImmediate(true);
		txtFiltroDistrito.setImmediate(true);
		
		txtFiltroCategoria.addListener((TextChangeListener)this);
		txtFiltroNombre.addListener((TextChangeListener)this);
		//txtFiltroCodigo.addListener((TextChangeListener)this);
		txtFiltroDistrito.addListener((TextChangeListener)this);
		
		
		List<CentroPoblado> lCentros = centroPobladoService.buscar(null);
		cargarCentroPoblado(lCentros);
		
		tblCentroPoblado.setSelectable(true);
		tblCentroPoblado.setImmediate(true);
		tblCentroPoblado.setNullSelectionAllowed(true);
		tblCentroPoblado.setNullSelectionItemId(null);
		tblCentroPoblado.setCacheRate(1);
		tblCentroPoblado.addListener(new ValueChangeListener() {

			private static final long serialVersionUID = -6124596484581515359L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean esModoNuevo = tblCentroPoblado.getValue() == null;
				limpiar();
				habilitarEdicion(!esModoNuevo);
				if(esModoNuevo){
					tblCentroPoblado.setValue(null);
				}else{
					Item item = tblCentroPoblado.getItem(tblCentroPoblado.getValue());
					
					centroPoblado.setId(Long.valueOf(item.getItemProperty("id").getValue().toString()));
					txtNombre.setValue(item.getItemProperty("nombre").getValue());
					cmbCategoria.select(new Valor((Long) item.getItemProperty("categoria.id").getValue()));
					cmbEstado.select(new Valor((Long) item.getItemProperty("estado.id").getValue()));
					cmbDistrito.select((Distrito) item.getItemProperty("distrito").getValue());
				}
			}
		});
		btnCrearEstado.addListener((ClickListener)this);
		btnEliminar.addListener((ClickListener)this);
		limpiar();
		
	}
	
	private void cargarCentroPoblado(List<CentroPoblado> lstEntidades ){
		
		IndexedContainer container = new IndexedContainer();
		container.addContainerProperty("id", Long.class,  null);
		container.addContainerProperty("categoria.nombre", String.class, null);
		container.addContainerProperty("categoria.id", Long.class, null);
		container.addContainerProperty("estado.id", Long.class, null);
		container.addContainerProperty("nombre", String.class, null);
		container.addContainerProperty("distrito", Distrito.class, null);
		container.addContainerProperty("distrito.nombre", String.class, null);
		container.addContainerProperty("distrito.id", Long.class, null);
		
		tblCentroPoblado.setContainerDataSource(container);
		tblCentroPoblado.setVisibleColumns(new Object[]{"categoria.nombre","nombre","distrito.nombre"});
	
		tblCentroPoblado.setColumnWidth("categoria.nombre", 100);
		tblCentroPoblado.setColumnWidth("nombre", 250);
		tblCentroPoblado.setColumnWidth("distrito.nombre", 200);
		
		tblCentroPoblado.setColumnHeader("categoria.nombre", "categoria");
		tblCentroPoblado.setColumnHeader("nombre", "nombre");
		tblCentroPoblado.setColumnHeader("distrito.nombre", "Distrito");
		
		int con=1;
		for (CentroPoblado entidad: lstEntidades){
			Item item = container.addItem(con++);
			item.getItemProperty("id").setValue(entidad.getId());
			item.getItemProperty("categoria.id").setValue(entidad.getCategoria() != null ? entidad.getCategoria().getId() : null);
			item.getItemProperty("categoria.nombre").setValue(entidad.getCategoria() != null ? entidad.getCategoria().getNombre() : StringUtils.EMPTY);
			item.getItemProperty("estado.id").setValue(entidad.getEstado() != null ? entidad.getEstado().getId() : null);
			item.getItemProperty("nombre").setValue(entidad.getNombre());
			item.getItemProperty("distrito").setValue(entidad.getDistrito());
			item.getItemProperty("distrito.id").setValue(entidad.getDistrito() != null ? entidad.getDistrito().getId() : null);
			item.getItemProperty("distrito.nombre").setValue(entidad.getDistrito() != null ? entidad.getDistrito().getNombre() : StringUtils.EMPTY);
		}
	}
	
	private void habilitarEdicion(boolean flag){
		flagNuevaEstado = !flag;
		if(flag){
			btnCrearEstado.setCaption("Actualizar");
		}
		else{
			btnCrearEstado.setCaption("Crear");
		}
	}

	private void limpiar(){
		centroPoblado = new CentroPoblado();
		cmbCategoria.select(null);
		txtNombre.setValue("");
		cmbEstado.select(null);
		cmbDistrito.select(null);
	}
	
	private void refrescar(){
		habilitarEdicion(false);
		limpiar();
		List<CentroPoblado> lstEntidades = centroPobladoService.buscar(null);
		cargarCentroPoblado(lstEntidades);
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnCrearEstado)){
			StringBuilder sbContenido = new StringBuilder();
			centroPoblado.setNombre(txtNombre.getValue().toString());
			centroPoblado.setEstado((Valor) cmbEstado.getValue());
			centroPoblado.setCategoria((Valor) cmbCategoria.getValue());
			centroPoblado.setDistrito((Distrito) cmbDistrito.getValue());
			centroPoblado.validar();
			if(flagNuevaEstado){
				centroPobladoService.crear(centroPoblado);
				sbContenido.append("Centro Poblado : ").append(centroPoblado.getNombre()).append(" se ha "+ Constante.OPERACION.CREAR_REGISTRO+" satisfactoriamente.");
			}else{
				centroPobladoService.actualizar(centroPoblado);
				sbContenido.append("Centro Poblado : ").append(centroPoblado.getNombre()).append(" se ha "+ Constante.OPERACION.ACTUALIZAR_REGISTRO+" satisfactoriamente.");
			}
			AlertDialog alertDialog = new  AlertDialog("Centro Poblado", sbContenido.toString(), "Aceptar", "400");
			getApplication().getMainWindow().addWindow(alertDialog);
		}
		if(event.getButton().equals(btnEliminar)){
			centroPobladoService.eliminarXId(centroPoblado.getId());
		}	
		refrescar();
	}

	@Override
	public void textChange(TextChangeEvent event) {
	CentroPoblado entidad = new CentroPoblado();
	
		if(event.getSource().equals(txtFiltroNombre)){
						
			if(StringUtils.isNotBlank(event.getText())){
				entidad.setNombre(event.getText());
			}
			
		}
		
		if(event.getSource().equals(txtFiltroCategoria)){
			if(StringUtils.isNotBlank(event.getText())){
				Valor categoria = new Valor();
				categoria.setNombre(event.getText());	
				entidad.setCategoria(categoria);
			}
			
		}

		if(event.getSource().equals(txtFiltroDistrito)){
			if(StringUtils.isNotBlank(event.getText())){
				Distrito distrito = new Distrito();
				distrito.setNombre(event.getText());	
				entidad.setDistrito(distrito);
			}
		}
		
		cargarCentroPoblado(centroPobladoService.buscar(entidad));
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		mainLayout.setComponentAlignment(pnlPrincipal, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new HorizontalLayout();
		pnlPrincipal.setStyleName("whiteBackGround");
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(true);
		pnlPrincipal.setSpacing(true);
		
		// pnlListadoEstado
		pnlListadoEstado = buildPnlListadoEstado();
		pnlPrincipal.addComponent(pnlListadoEstado);
		
		// pnlDatosEstado
		pnlDatosEstado = buildPnlDatosEstado();
		pnlPrincipal.addComponent(pnlDatosEstado);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private VerticalLayout buildPnlListadoEstado() {
		// common part: create layout
		pnlListadoEstado = new VerticalLayout();
		pnlListadoEstado.setImmediate(false);
		pnlListadoEstado.setWidth("-1px");
		pnlListadoEstado.setHeight("-1px");
		pnlListadoEstado.setMargin(false);
		
		// lblFiltroBusqueda
		lblFiltroBusqueda = new Label();
		lblFiltroBusqueda.setStyleName("h2");
		lblFiltroBusqueda.setImmediate(false);
		lblFiltroBusqueda.setWidth("560px");
		lblFiltroBusqueda.setHeight("-1px");
		lblFiltroBusqueda.setValue("Fitro de Busqueda");
		pnlListadoEstado.addComponent(lblFiltroBusqueda);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		pnlListadoEstado.addComponent(horizontalLayout_1);
		
		// tblCentroPoblado
		tblCentroPoblado = new TreeTable();
		tblCentroPoblado.setImmediate(false);
		tblCentroPoblado.setWidth("550px");
		tblCentroPoblado.setHeight("400px");
		pnlListadoEstado.addComponent(tblCentroPoblado);
		
		return pnlListadoEstado;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("-1px");
		horizontalLayout_1.setHeight("-1px");
		horizontalLayout_1.setMargin(false);
		
		// txtFiltroCategoria
		txtFiltroCategoria = new TextField();
		txtFiltroCategoria.setImmediate(false);
		txtFiltroCategoria.setWidth("150px");
		txtFiltroCategoria.setHeight("-1px");
		txtFiltroCategoria.setInputPrompt("Categoria");
		horizontalLayout_1.addComponent(txtFiltroCategoria);
		
		// txtFiltroNombre
		txtFiltroNombre = new TextField();
		txtFiltroNombre.setImmediate(false);
		txtFiltroNombre.setWidth("150px");
		txtFiltroNombre.setHeight("-1px");
		txtFiltroNombre.setInputPrompt("Nombre");
		horizontalLayout_1.addComponent(txtFiltroNombre);
		
		// txtFiltroDistrito
		txtFiltroDistrito = new TextField();
		txtFiltroDistrito.setImmediate(false);
		txtFiltroDistrito.setWidth("150px");
		txtFiltroDistrito.setHeight("-1px");
		txtFiltroDistrito.setInputPrompt("Distrito");
		horizontalLayout_1.addComponent(txtFiltroDistrito);
		
		return horizontalLayout_1;
	}

	@AutoGenerated
	private VerticalLayout buildPnlDatosEstado() {
		// common part: create layout
		pnlDatosEstado = new VerticalLayout();
		pnlDatosEstado.setStyleName("h2");
		pnlDatosEstado.setCaption("Administración de Centros Poblados");
		pnlDatosEstado.setImmediate(false);
		pnlDatosEstado.setWidth("-1px");
		pnlDatosEstado.setHeight("-1px");
		pnlDatosEstado.setMargin(false);
		pnlDatosEstado.setSpacing(true);
		
		// txtNombre
		txtNombre = new TextField();
		txtNombre.setCaption("Nombre");
		txtNombre.setImmediate(false);
		txtNombre.setWidth("220px");
		txtNombre.setHeight("-1px");
		txtNombre.setRequired(true);
		txtNombre.setInputPrompt("Nombre del Centro Poblado");
		pnlDatosEstado.addComponent(txtNombre);
		
		// cmbCategoria
		cmbCategoria = new ComboBox();
		cmbCategoria.setCaption("Categoria");
		cmbCategoria.setImmediate(false);
		cmbCategoria.setWidth("250px");
		cmbCategoria.setHeight("-1px");
		pnlDatosEstado.addComponent(cmbCategoria);
		
		// cmbDistrito
		cmbDistrito = new ComboBox();
		cmbDistrito.setCaption("Distrito");
		cmbDistrito.setImmediate(false);
		cmbDistrito.setWidth("250px");
		cmbDistrito.setHeight("-1px");
		pnlDatosEstado.addComponent(cmbDistrito);
		
		// cmbEstado
		cmbEstado = new ComboBox();
		cmbEstado.setCaption("Estado");
		cmbEstado.setImmediate(false);
		cmbEstado.setWidth("200px");
		cmbEstado.setHeight("-1px");
		cmbEstado.setRequired(true);
		pnlDatosEstado.addComponent(cmbEstado);
		
		// pnlEstadoBotones
		pnlEstadoBotones = buildPnlEstadoBotones();
		pnlDatosEstado.addComponent(pnlEstadoBotones);
		pnlDatosEstado.setComponentAlignment(pnlEstadoBotones,
				new Alignment(48));
		
		return pnlDatosEstado;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlEstadoBotones() {
		// common part: create layout
		pnlEstadoBotones = new HorizontalLayout();
		pnlEstadoBotones.setImmediate(false);
		pnlEstadoBotones.setWidth("-1px");
		pnlEstadoBotones.setHeight("-1px");
		pnlEstadoBotones.setMargin(true);
		pnlEstadoBotones.setSpacing(true);
		
		// btnCrearEstado
		btnCrearEstado = new Button();
		btnCrearEstado.setCaption("Crear");
		btnCrearEstado.setImmediate(true);
		btnCrearEstado.setWidth("-1px");
		btnCrearEstado.setHeight("-1px");
		pnlEstadoBotones.addComponent(btnCrearEstado);
		
		// btnEliminar
		btnEliminar = new Button();
		btnEliminar.setCaption("Eliminar");
		btnEliminar.setImmediate(true);
		btnEliminar.setWidth("-1px");
		btnEliminar.setHeight("-1px");
		pnlEstadoBotones.addComponent(btnEliminar);
		
		return pnlEstadoBotones;
	}
}
